import http from 'wechat-http'

// 1. 设置全局默认请求地址
http.baseURL = 'https://live-api.itheima.net'

// 请求拦截器
http.intercept.request = (config) => {
  // 1.1. 对请求数据做点什么
  // console.log('🟢 config', config)
  // 常见错误
  // config.header.Authorization = wx.getStorageSync('token')
  config.header = {
    // 携带 token 信息
    Authorization: 'Bearer ' + wx.getStorageSync('token'),
    // 如果有传递 header 信息，可覆盖默认的 header 信息
    ...config.header,
  }
  return config
}

// 2. 设置响应拦截器
// http.interceptors.response.use(
http.intercept.response = async (res) => {
  // 2.1. 对响应数据做点什么
  // console.log('响应拦截器', res.data)
  // code 业务状态码为 10000 才表示成功
  if (res.data.code === 10000) {
    // 2.2. 返回响应数据
    return res.data
  }
  // 业务状态码为 401，表示 token 过期，需实现无感刷新
  else if (res.data.code === 401) {
    // 如果当前请求的路径是 /refreshToken 就别再刷新了，否则会死循环
    if (res.config.url.includes('/refreshToken')) {
      // 获取当前页面栈数组
      const pages = getCurrentPages()
      // 获取当前页面实例
      const page = pages[pages.length - 1]
      wx.redirectTo({
        // 注意事项：redirectUrl= 后面的 / 不能省略
        url: '/pages/login/index?redirectUrl=/' + page.route,
      })
      // 退出当前逻辑
      return
    }
    // 通过 refreshToken 刷新 token
    const res2 = await http({
      method: 'POST',
      url: '/refreshToken',
      header: {
        Authorization: `Bearer ` + wx.getStorageSync('refreshToken'),
      },
    })
    // 存储两个新的 token
    const app = getApp()
    app.setToken('token', res2.data.token)
    app.setToken('refreshToken', res2.data.refreshToken)

    // 打印外层的 res.config 获取到原请求的配置
    // console.log('🟢 res', res.config)
    // 修改成新的 token
    res.config.header = {
      Authorization: `Bearer ` + wx.getStorageSync('token'),
    }
    // 通过新的 token 重发请求
    return http(res.config)
  }
  // 其他通用错误
  else {
    // 其他错误情况，根据后端返回的信息，前端左轻提示
    wx.utils.toast(res.data.message || '业务错误')
    // 主动返回失败的 Promise，目的：不执行业务 await 后续代码
    return Promise.reject(res.data)
  }
}

// 3. 导出
export default http
